package com.lam.common.components.data.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.lam.common.components.data.model.Auto;
import com.lam.common.components.data.model.DataInjectConfig;
import com.lam.common.components.data.model.ResultType;

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataInject {
	
	/** 转换字典时源值的字段名，不填默认为当前字段 */
	String origField() default "";

    /**
     * 查询数据的表名
     */
    String tableName() default "";
    
    /** 查询tableName表的数据库字段名称，默认为全部* */
    String listField() default "*";
    
    /** 查询SQL返回的结果类型 */
    ResultType resultType() default ResultType.AUTO;
    
    /**
     * 查询结果的数据类型，默认auto根据定义的字段类型进行自动匹配，若字段类型为Object等基本类型时，结果将用Map或List<Map>承载
     */
    Class<?> dataType() default Auto.class; 
    
    /** 是否缓存 */
	boolean useCache() default true;
	
    /**
     * useCache 为true时有效；
     * 查询结果的缓存有效期，为空则不缓存，默认: conditionSql 2小时, customSql 5分钟
     * <br>例：
     * <pre>
     *  1天：1d或1D
     *  2小时：2h或2H 
     *  10分钟：10m或10M
     *  30秒：30s或30S
     * </pre>
     */
    String expire() default DataInjectConfig.EXPIRE_AUTO;
    
    /** 
     * 查询条件SQL，支持变量，变量用{变量名称}占位 ，
     * <br> 例：
     * <pre>
     *  and user_id={userId} and project_id={projectId}
     * </pre>
     */
    String conditionSql() default "";
    
    /** 
     * 自定义SQL，优先使用此属性，支持变量，变量用{变量名称}占位 ，
     * <br> 例：
     * <pre>
     *  select * from user u <br>
     *  left join project p on u.project_id = p.id <br>
     *  where user_id={userId} and project_id={projectId}
     * </pre>
     */
    String customSql() default "";
    
}
